package com.company.common;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import io.jsonwebtoken.*;

import java.util.Date;
import java.util.Map;

public class JwtUtils {
    //过期时间
    // public static final long EXPIRE = 1000 * 60 * 60 * 24;//一天
    public static final long EXPIRE = 1000 * 50;//设置token 50秒过期，看50秒之后token是否过期
    //密钥
    public static final String APP_SECRET = "123abcd!@#";//必须4位长度以上


    /**
     * 根据token主体部分自定义属性获取对应的值
     *
     * @param jwtToken token字符串
     * @param key      主体部分自定义的名字
     * @return
     */
    public static String getJwtToken(String jwtToken, String key) {
        if (StringUtils.isEmpty(jwtToken)) return "";
        Jws<Claims> claimsJws = Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
        Claims claims = claimsJws.getBody();//获取token的载荷部分payload 
        // System.out.println(claims.getIssuedAt() + "===" + claims.getExpiration() + "===" + claims.getNotBefore());//获取token签发时间、失效时间
        return (String) claims.get(key);
    }

    /**
     * 验证token是否有效
     *
     * @param jwtToken token字符串
     * @return
     */
    public static boolean checkToken(String jwtToken) {
        if (StringUtils.isEmpty(jwtToken)) {
            return false;
        }
        try {
            Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);//如果token修改过，这里可能会出错（因为底层是通过json格式验证的）
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }


    /**
     * 生成jwt token
     *
     * @param mapClaim 自定义属性
     * @return
     */
    public static String createJwtToken(Map<String, Object> mapClaim) {
        JwtBuilder builder = Jwts.builder();
        builder.setHeaderParam("typ", "JWT").setHeaderParam("alg", "HS256");//1、头(header)信息

        //2、主体(payload)信息
        builder.setSubject("ll-user")  // 主题
                .setIssuedAt(new Date()) // 签发时间
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE)) //过期时间
                .setClaims(mapClaim);//自定义数据

        // 3、签名部分signature
        builder.signWith(SignatureAlgorithm.HS256, APP_SECRET);// 签名算法以及密匙
        return builder.compact();
    }
}
